package fgin

// 抛出grpc拨号和监听的options配置，允许使用自定义
import (
	"google.golang.org/grpc"
)

var (
	grpcServerOptionsObj = grpcServerOptions{}
	grpcDialOptionsObj   = grpcDialOptions{}
)

// grpc服务端
type grpcServerOptions struct {
	opts                           []grpc.ServerOption
	disableDefaultTimeout          bool // 是否禁止框架自带的客户端连接超时配置
	disableDefaultUnaryInterceptor bool // 是否禁止使用框架自带的服务端一元拦截器。禁止会导致，框架中的请求日志、jaeger、prometheus、限流、熔断、热插拔3方插件失效。不建议禁止
}

// 注册grpc server options 进入框架
// 是否禁止框架自带的客户端连接超时配置
// 是否禁止使用框架自带的一元拦截器。禁止会导致，框架中的请求日志、jaeger、prometheus、限流、熔断、热插拔3方插件失效。不建议禁止
func RegisterGrpcServerOptions(opts []grpc.ServerOption, disableDefaultTimeout, disableDefaultUnaryInterceptor bool) {
	if fginConfig.ServiceName != "" {
		panic("RegisterGrpcServerOptions 方法应当在 GetGrpcServer、GetHttpServer、GetHttpGrpcServer 之前进行调用")
	}
	grpcServerOptionsObj.opts = opts
	grpcServerOptionsObj.disableDefaultTimeout = disableDefaultTimeout
	grpcServerOptionsObj.disableDefaultUnaryInterceptor = disableDefaultUnaryInterceptor
}

// grpc客户端
type grpcDialOptions struct {
	opts                                   []grpc.DialOption
	disableDefaultWithTransportCredentials bool // 是否禁止框架默认安全协议
	disableDefaultWithUnaryInterceptor     bool // 是否禁止使用框架自带的客户端一元拦截器。禁止会导致，框架中的请求日志、jaeger、自动重新微服务寻址、限流、熔断、热插拔3方插件失效。不建议禁止
}

// 注册grpc dial options 进入框架
// disableDefaultWithTransportCredentials 是否禁止框架默认安全协议
// disableDefaultWithUnaryInterceptor 是否禁止使用框架自带的客户端一元拦截器。禁止会导致，框架中的请求日志、jaeger、发生异常重新微服务寻址、限流、熔断、热插拔3方插件失效。不建议禁止
func ReginsterGrpcDialOptions(opts []grpc.DialOption, disableDefaultWithTransportCredentials, disableDefaultWithUnaryInterceptor bool) {
	if fginConfig.ServiceName != "" {
		panic("ReginsterGrpcDialOptions 方法应当在 GetGrpcServer、GetHttpServer、GetHttpGrpcServer 之前进行调用")
	}
	grpcDialOptionsObj.opts = opts
	grpcDialOptionsObj.disableDefaultWithTransportCredentials = disableDefaultWithTransportCredentials
	grpcDialOptionsObj.disableDefaultWithUnaryInterceptor = disableDefaultWithUnaryInterceptor
}
